<?php
include_once BXD_INCLUDEPATH . 'lib/ErrorManager.php';

/**
 * Classe per la validazione di Entity o valori
 *
 * @author Damiano Ciarla
 * @version 1.0
 * @category lib/validator
 */
class Validator
{
	//--> Tutti i validatori di default ESCLUSI quelli riferiti ai campi del DB MySql

	const VALIDATE_CC_AMERICAN_EXPRESS	= "CCAmericanExpress";
	const VALIDATE_CC_MASTERCARD		= "CCMastercard";
	const VALIDATE_CC_VISA				= "CCVisa";
	const VALIDATE_DATE_DMY				= "DateDMY";
	const VALIDATE_DATE_YMD				= "DateYMD";
	const VALIDATE_EMAIL				= "Email";
	const VALIDATE_IT_FISCAL_CODE		= "ITFiscalCode";
	const VALIDATE_IN_VALUE				= "InValue";
	const VALIDATE_IP_ADDRESS			= "IpAddress";
	const VALIDATE_MAX_LENGTH			= "MaxLength";
	const VALIDATE_MAX_VALUE			= "MaxValue";
	const VALIDATE_MIN_LENGTH			= "MinLength";
	const VALIDATE_MIN_VALUE			= "MinValue";
	const VALIDATE_UNIQUE				= "Unique";
	const VALIDATE_ZIP_CODE				= "ZipCode";
	const VALIDATE_REQUIRED				= "Required";

	private $error		= null;
	private $referer	= null;
	private $isValid	= TRUE;

	/**
	 * Inizializza la classe Validator con l'istanza per la gestione degli errori
	 * ed il nome dell'etichetta a cui si vogliono associare
	 *
	 * @param string $referer Nome dell'etichetta a cui si vogliono associare eventuali errori
	 */

	function __construct($referer = null)
	{
		$this->referer	= $referer;
		$this->error	= ErrorManager::getInstance();

		if (!is_null($referer) && !is_bool($referer))
			$this->error->setReferer($referer);
	}

	/**
	 * Questo metodo valida instantaneamente il valore che viene passato ad un
	 * determinato validatore
	 *
	 * @param string $validator	Nome del validatore senza il prefisso 'Validate'
	 * @param string $field		Nome del campo
	 * @param string $value		Valore da validare
	 * @param string $condition	'OPZIONALE' - > Eventuale condizione per la validazione
	 */

	public function checkNow($validator, $field, $value, $condition = NULL)
	{
		$nameFile	= NULL;

		if(file_exists(BXD_INCLUDEPATH . 'lib/validator/basicValidators/Validate' . $validator . ".php"))
		{
			$nameFile = BXD_INCLUDEPATH . 'lib/validator/basicValidators/Validate' . $validator . ".php";
		}
		else if(file_exists('../include/validators/Validate' . $validator . ".php"))
		{
			$nameFile = '../include/validators/Validate' . $validator . ".php";
		}

		if($nameFile !== NULL)
		{
			include_once $nameFile;

			$nameClass	= "Validate" . ucfirst($validator);
			$instance	= new $nameClass();

			$resValidate = $instance->validate($field, $value, $condition);

			if(is_bool($resValidate))
			{
				return TRUE;
			}
			else
			{
				$this->error->addError($resValidate);

				return FALSE;
			}
		}

		if($nameFile === NULL) return TRUE;
	}

	/**
	 * Il seguente metodo si differenzia dal precedente 'checkNow' nel fatto che
	 * il risultato della validazione viene memorizzato nella variabile 'isValid'
	 * e quindi si puo' impostare una serie di validazioni e sapere alla fine se
	 * tutte sono andate a buon fine o meno.
	 *
	 * @param string $validator	Nome del validatore senza il prefisso 'Validate'
	 * @param string $field		Nome del campo
	 * @param string $value		Valore da validare
	 * @param string $condition	'OPZIONALE' - > Eventuale condizione per la validazione
	 */

	public function add($validator, $field, $value, $condition = NULL)
	{
		$nameFile = NULL;

		if(file_exists(BXD_INCLUDEPATH . 'lib/validator/basicValidators/Validate' . $validator . ".php"))
		{
			$nameFile = BXD_INCLUDEPATH . 'lib/validator/basicValidators/Validate' . $validator . ".php";
		}
		else if(file_exists('../include/validators/Validate' . $validator . ".php"))
		{
			$nameFile = '../include/validators/Validate' . $validator . ".php";
		}

		if($nameFile !== NULL)
		{
			include_once $nameFile;

			$nameClass= "Validate" . ucfirst($validator);

			$instance = new $nameClass();

			$resValidate = $instance->validate($field, $value, $condition);

			if(!is_bool($resValidate))
			{
				$this->error->addError($resValidate);

				$this->isValid = FALSE;
			}
		}
	}

	/**
	 * Metodo il risultato della validazione
	 *
	 * @return boolean Risultato della validazione
	 */

	public function isValid()
	{
		return $this->isValid;
	}
}
?>
